package tech.aistar.corejava.day15.homework;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author: lya
 * @Description: 本类的作用描述:
 * 2. 定义两个线程，一个线程a向集合里输入数据
 * （-100到100），一个线程b读取数据，b在集合里面有40个数据以后开始运行。
 * @CreateDate: 2019/8/5
 * @Version: 1.0
 */
public class Demo02 {
    public static void main(String[] args) {
        Data d = new Data();

        Thread t1 = new Thread() {  //创建存数据线程
            @Override
            public void run() {
                d.setData();
            }
        };

        Thread t2 = new Thread() {  //创建取数据线程
            @Override
            public void run() {
                d.getData();
            }
        };

        t1.setName("存数据线程");
        t2.setName("取数据线程");
        t2.start();
        t1.start();
    }
}

class Data{

    private List<Integer> list = new ArrayList<>();  //定义一个集合存放数据

    //存数据
    public void setData() {
        synchronized (this) {
            for (int i = -100; i <= 100; i++) {
                list.add(i);
                System.out.println(Thread.currentThread().getName() + "放数据" + i);
                if (list.size() >= 40) {
                    notifyAll();   //若集合长度大于等于40,唤醒取数据线程
                }
            }

        }

    }

    //读数据
    public void getData() {
        synchronized (this) {
            if (list.size() < 40) {  //若集合长度小于40,等待
                try {
                    wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

            //长度大于40读数据
            for (int i = list.size() - 40; i > 0; i--) {
                System.out.println(Thread.currentThread().getName() + "读出数据" + list.get(list.size() - 1));
                list.remove(list.size() - 1);

            }
        }

    }
}
